#include "SalaPartida.h"
#include <string>
#include <iostream>

SalaPartida::SalaPartida(int id, int jugNecesarios, Glib::ustring jugConec,
                         int nivel,
                         BotonPartida *button_unirme, 
                         BotonPartida *button_salir) {
    this->idPartida = id;
    this->jugNecesarios = jugNecesarios;
    this->jugConectados = 0;
    this->nivel = nivel;

    set_size_request(170, 260);

    button_salir->set_label("Salir");
    button_salir->set_size_request(40, 30);

    button_unirme->set_label("Unirme!");
    button_unirme->set_size_request(40, 30);

    this->button_unirme = button_unirme;
    this->button_salir = button_salir;

    inicializarScroll();

    inicializarListadoPartidas();

    insertarWidgets();

    agregarConectados(jugConec);
}

void SalaPartida::actualizarEncabezado() {
    Gtk::TreeViewColumn *col = m_TreeView.get_column(0);

    std::string encabezado = "Nivel " + std::to_string(nivel);

    encabezado += " ( " + std::to_string(jugConectados);
    encabezado += "/" + std::to_string(jugNecesarios) + " )";

    col->set_title(encabezado);
    col->set_alignment(0.5);
}

void SalaPartida::borrarConectado(std::string jugador) {
    Gtk::TreeModel::Children children = m_refTreeModel->children();
    Gtk::TreeModel::Row row;

    Gtk::TreeModel::Children::iterator iter;

    for (iter = children.begin(); iter != children.end(); ++iter) {
        row = *iter;

        if (row[m_Columns.usuarioConectado] == jugador) {
            m_refTreeModel->erase(row);
            jugConectados--;
            break;
        }
    }

    actualizarEncabezado();
}

void SalaPartida::agregarConectado(std::string jugador) {
    Gtk::TreeModel::Row row = *(m_refTreeModel->append());

    row[m_Columns.usuarioConectado] = jugador;

    jugConectados++;

    actualizarEncabezado();
}

void SalaPartida::agregarConectados(Glib::ustring jugConec) {
    std::string jugadores = jugConec;

    while ((int)jugadores.find_first_of(",") != -1) {
        std::string jugAux = jugadores.substr(0, jugadores.find_first_of(","));

        jugadores = jugadores.substr(jugadores.find_first_of(",") + 1);

        agregarConectado(jugAux);
    }
    agregarConectado(jugadores);
}

void SalaPartida::inicializarListadoPartidas() {
    m_refTreeModel = Gtk::ListStore::create(m_Columns);

    m_TreeView.set_model(m_refTreeModel);

    m_TreeView.append_column("", m_Columns.usuarioConectado);

    scrollConectados.add(m_TreeView);
}

void SalaPartida::insertarWidgets() {
    put(scrollConectados, 0, 0);
    put(*button_unirme, 10, 224);
    put(*button_salir, 100, 224);
}

void SalaPartida::inicializarScroll() {
    scrollConectados.set_size_request(170, 220);
    scrollConectados.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS);
}

SalaPartida::~SalaPartida() {
    remove(scrollConectados);
    remove(*button_salir);
    remove(*button_unirme);
    delete button_salir;
    delete button_unirme;
}
